home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
021-030
/
amok22
/
bigsets
/
bigsets.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
4KB
|
148 lines
(**********************************************************************
:Program. BigSets.def
:Contents. Generic data type: SETs with up to 65335 elements (bits)
:Author. Nicolas Benezan [bne]
:Address. Postwiesenstr. 2, 7000 Stuttgart 60, Germany
:Phone. (0)711 / 33 36 79
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga AMSoft V3.2d
:History. V1.0 [bne] 30.Jan.1989 (PC version)
:History. V1.1 [bne] 02.Jul.1989 (Amiga version)
**********************************************************************)
IMPLEMENTATION MODULE BigSets;
FROM Arts IMPORT Assert;
FROM TaskMemory IMPORT Allocate, Deallocate;
FROM SYSTEM IMPORT ADDRESS, ADR, BITSET, CAST;
TYPE
BigSet=POINTER TO BigSetBody;
BigSetBody=(*RECORD
NumElements:*)CARDINAL;(*
BitArray:ARRAY [0..NumElements DIV 16] OF BITSET;
END;*)
BitSetPtr=POINTER TO BITSET;
CONST
RangeError="BigSets: Range violation";
(**)
(* Word aligned size of BigSetBody in bytes *)
(**)
PROCEDURE BodySize(NumBits:CARDINAL):CARDINAL;
BEGIN
RETURN (NumBits DIV 16)*2+SIZE(BigSetBody);
END BodySize;
(**)
(* Creation *)
(**)
PROCEDURE CreateBigSet(VAR Set: BigSet;
NumElements: CARDINAL): BOOLEAN;
BEGIN
BigSetsAllocProc(Set, BodySize(NumElements)+SIZE(BITSET));
IF Set#NIL THEN
Set^:=NumElements;
RETURN TRUE;
END;
RETURN FALSE;
END CreateBigSet;
(**)
(* Deletion *)
(**)
PROCEDURE DiscardBigSet(VAR Set: BigSet);
BEGIN
IF Set#NIL THEN
BigSetsDeallocProc(Set);
Set:=NIL;
END;
END DiscardBigSet;
(**)
(* Compute bit position *)
(**)
PROCEDURE Access( Set: BigSet;
VAR Bit: CARDINAL;
VAR SetPtr: BitSetPtr);
BEGIN
Assert(Bit<Set^, ADR(RangeError));
SetPtr:=ADDRESS(LONGINT(Set)+LONGINT(BodySize(Bit)));
Bit:=Bit MOD 16;
END Access;
(**)
(* Include / Exclude *)
(**)
PROCEDURE Include(Set: BigSet;
Bit: CARDINAL);
VAR
SetPtr: BitSetPtr;
BEGIN
Access(Set, Bit, SetPtr);
INCL(SetPtr^, Bit);
END Include;
PROCEDURE Exclude(Set: BigSet;
Bit: CARDINAL);
VAR
SetPtr: BitSetPtr;
BEGIN
Access(Set, Bit, SetPtr);
EXCL(SetPtr^, Bit);
END Exclude;
(**)
(* Test bit *)
(**)
PROCEDURE BitInSet(Set: BigSet;
Bit: CARDINAL): BOOLEAN;
VAR
SetPtr: BitSetPtr;
BEGIN
Access(Set, Bit, SetPtr);
RETURN Bit IN SetPtr^
END BitInSet;
PROCEDURE FindNextClear( Set: BigSet;
VAR Bit: CARDINAL): BOOLEAN;
VAR
SetPtr: BitSetPtr;
Pos, Test: CARDINAL;
BEGIN
Pos:=Bit;
Access(Set, Bit, SetPtr);
DEC(Pos, Bit);
FOR Pos:=Pos TO Set^-1 BY 16 DO
IF CAST(CARDINAL, SetPtr^)#0FFFFH THEN
FOR Test:=Bit TO 15 DO
IF NOT (Test IN SetPtr^) THEN
Bit:=Pos+Test;
RETURN Bit<Set^
END;
END;
END;
Bit:=0;
INC(SetPtr, SIZE(BITSET));
END;
(* BEGIN
WHILE BitInSet(Set, Bit) DO
INC(Bit);
IF Bit>=Set^ THEN
RETURN FALSE
END;
END;
RETURN TRUE; *)
END FindNextClear;
BEGIN
BigSetsAllocProc:=Allocate;
BigSetsDeallocProc:=Deallocate;
END BigSets.